Androidを支える技術<II>輪読会 3.1, 3.2章
日付:1/19
章:3.1
調査者:ichimura.icon
章のまとめ
どんな内容が書かれているか?
3.1節はカーネル側でのメモリ不足時の挙動
3.2節はandroidのメモリ不足時の処理の基礎(話はLinuxメイン)
メモリ不足時のカーネル側の振る舞い
振る舞い
「lmkdにメッセージを送ることでoom_score_adjを更新し、そしてこのスコアに応じて、メモリ不足の時にはlowmemorykillerドライバやOOM Killerがスコアの高いプロセスをkillすることでメモリを解放する」
oom_score_adjを更新するだけの目的のデーモン
oom_score_adjは特権でしか設定できない
特権作業はデーモンにお願い
oom_scoreをカスタマイズするためのスコア
Linuxカーネルによって公開されている
AndroidがLinuxにkillを促すスコア
OOM Killerによって参照される
oom_scoreはLinuxの独断と偏見(アドホック) で計算される
重要じゃなく、メモリをたくさん持っているプロセスのスコアが高くなる
メモリ不足になるとLinuxカーネルはoom_scoreを参考にプロセスをkillしていく
メモリ不足の最終段階
OOM Killerがプロセスkillをし始める前にプロセスをkillする
これもoom_score_adjを参照してkillするプロセスを決めている
Linuxカーネルのメモリ回収
linuxのメモリ確保と解放はプロセスから正確に認識できない構造になっている。
プロセスがメモリを確保したと認識した時、実際には確保せず、実際に必要になった瞬間にメモリを割り当てる
iNoma.iconすごい
メモリの確保の仕方も色々ある
ユーザープロセス
デバイスドライバ
コンピュータに接続したデバイスとソフトウェアとの通信を制御するプログラム
カーネル内オブジェクト
ユーザープロセスが明示的に確保するわけではない
ディスクキャッシュなどカーネルに近い固定サイズの小さなオブジェクトが確保する時に使われる
ユーザープロセス以外にもたくさん必要とするメモリがある
複雑であるため、勝手に回収できそうなページフレーム(物理メモリの割り当て単位)を回収していく
Linuxのページフレーム回収の概要
次の2つのタイミングで回収が始まる
メモリ確保時
一定値より少ない時、ページフレームの回収が試みられる
きっかけっていうだけで、無関係に回収が発生する
定期
kswapdというデーモンによってもページフレームの回収が試みられる
メモリ確保時と基本的には同じ処理を行う
回収はゾーンアロケー田由来のページフレームを4種に分けたうち、同期可能ページと破棄可能ページが回収される
Androidはこの同期可能ページをmmap(多分メモリマップ)するようになっている
table:ページフレーム回収時のページの分類
名前 概略
同期可能ページ 2次記憶にあるファイルの中身と同じ内容のメモリ
破棄可能ページ 現在使用してないがキャッシュとして存在しているメモリ
回収不能ページ ファイルの中身と違うメモリ内にしか保持されてない内容を含むメモリや、既に回収済みで回収の必要のないメモリ
スワップ可能ページ スワップすることで解放できるメモリ
OOM Killerとoom_score
基本、これが働くのはLinuxとしても非常事態で滅多にない
けどandroidでは頻繁に働いてしまうので、工夫する必要がある
oom_scoreはカーネル独自に算出するため、それを参照してkillするOOM Killerは相当乱暴な仕組み
code:oom_scoreの確認
$ cat /proc/8002/oom/score
1000
このスコアが高いほどすぐkillされる
oom_score_adj
-1000 ~ 1000
大事なプロセスには低く、大事でないプロセスは高く設定することでkillを調整